package org.example.scoresystem_backen.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.scoresystem_backen.entity.Admin;

import java.util.List;

/**
 * 管理员数据访问Mapper接口
 */
@Mapper
public interface AdminMapper {
    
    /**
     * 根据ID查找管理员
     * @param id 管理员ID
     * @return 管理员信息
     */
    Admin findById(@Param("id") Integer id);
    
    /**
     * 查找所有管理员
     * @return 管理员列表
     */
    List<Admin> findAll();
    
    /**
     * 根据用户名查找管理员
     * @param username 用户名
     * @return 管理员信息
     */
    Admin findByUsername(@Param("username") String username);
    
    /**
     * 根据用户名和密码查找管理员（用于登录验证）
     * @param username 用户名
     * @param password 密码
     * @return 管理员信息
     */
    Admin findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
    
    /**
     * 检查用户名是否存在
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(@Param("username") String username);
    
    /**
     * 插入管理员
     * @param admin 管理员信息
     * @return 影响行数
     */
    int insert(Admin admin);
    
    /**
     * 更新管理员信息
     * @param admin 管理员信息
     * @return 影响行数
     */
    int update(Admin admin);
    
    /**
     * 根据ID删除管理员
     * @param id 管理员ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Integer id);
    
    /**
     * 根据角色查找管理员列表
     * @param role 角色
     * @return 管理员列表
     */
    List<Admin> findByRole(@Param("role") Admin.Role role);

    /**
     * 根据用户名模糊查询管理员
     * @param username 用户名关键字
     * @return 管理员列表
     */
    List<Admin> findByUsernameContaining(@Param("username") String username);

    /**
     * 统计管理员总数
     * @return 管理员总数
     */
    Long count();

    /**
     * 分页查询管理员列表（支持搜索和角色过滤）
     * @param search 搜索关键词（用户名模糊查询）
     * @param role 角色过滤
     * @param offset 偏移量
     * @param limit 限制条数
     * @return 管理员列表
     */
    List<Admin> findAdminsByPage(@Param("search") String search,
                                @Param("role") Admin.Role role,
                                @Param("offset") Integer offset,
                                @Param("limit") Integer limit);

    /**
     * 统计符合条件的管理员总数（用于分页）
     * @param search 搜索关键词（用户名模糊查询）
     * @param role 角色过滤
     * @return 总数
     */
    Long countAdminsWithFilter(@Param("search") String search,
                              @Param("role") Admin.Role role);

    /**
     * 检查用户名是否存在（排除指定ID）
     * @param username 用户名
     * @param excludeId 排除的管理员ID
     * @return 是否存在
     */
    boolean existsByUsernameExcludeId(@Param("username") String username,
                                     @Param("excludeId") Integer excludeId);
}
